package com.djbx.points.common.core.utils.lock;

import com.djbx.points.common.core.utils.ServiceResponse;

import java.util.concurrent.Callable;

/**
 * 〈Lock封装接口〉
 *
 * @author sader
 * @date 2021/11/26
 * @since 1.0.0
 */
public interface ILock {
    /**
     * 分布式锁的前缀
     */
    String KEY_DISTRIBUTED_LOCK = "DISTRIBUTED:LOCK:";
    /**
     * 默认锁过期时长（ms）
     */
    int DEFAULT_LEASE_TIME = 3000;


    /**
     * 添加分布式锁
     * 尝试获取锁，成功则执行callback，失败则直接返回
     * 默认锁过期时长{@see #DEFAULT_LEASE_TIME}
     * @param callable 锁中的业务逻辑
     * @return callable的返回值
     */
    <T> ServiceResponse<T> tryLock(Callable<ServiceResponse<T>> callable);

    /**
     * 添加分布式锁
     * 尝试获取锁，成功则执行callback，失败则等待waitTime时长之后重新尝试，再次失败之后直接返回
     * 默认锁过期时长{@see #DEFAULT_LEASE_TIME}
     * @param waitTime 等待时长
     * @param callable 锁中的业务逻辑
     * @return callable的返回值
     */
    <T> ServiceResponse<T> tryLock(long waitTime, Callable<ServiceResponse<T>> callable);

    /**
     * 添加分布式锁
     * 尝试获取锁，成功则执行callback，失败则直接返回
     * 默认锁过期时长{@see #DEFAULT_LEASE_TIME}
     * @param callable 锁中的业务逻辑
     * @param leaseTime 锁持续时长(ms)
     * @return callable的返回值
     */
    <T> ServiceResponse<T> tryLock(Callable<ServiceResponse<T>> callable, long leaseTime);

    /**
     * 添加分布式锁
     * 尝试获取锁，成功则执行callback，失败则等待waitTime时长之后重新尝试，再次失败之后直接返回
     * 锁过期时长leaseTime
     * @param callable 锁中的业务逻辑
     * @param leaseTime 锁持续时长(ms)
     * @return callable的返回值
     */
    <T> ServiceResponse<T> tryLock(long waitTime, Callable<ServiceResponse<T>> callable, long leaseTime);

    /**
     * 添加分布式锁
     * 获取阻塞同步锁，成功后执行callback
     * 锁过期时长为30s
     * @param callable 锁中的业务逻辑
     * @return callable的返回值
     */
    <T> ServiceResponse<T> lock(Callable<ServiceResponse<T>> callable);
}
